package com.webserver.http;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

/**
 * @author liyang
 * @version 1.0
 * @package com.webserver.http
 * @file HttpServletRequest.java
 * @description
 * @time 2024-05-04 13:08
 */
public class HttpServletRequest {
//    实例化的过程就包含解析请求这一步骤（已经做过，直接剪切）
    private Socket socket;
//  把拿不出去的局部变量的属性在这里定义

    private String method ;
    private String uri ;
    private String protocol ;

    private Map<String,String> headers = new HashMap<>();

    public HttpServletRequest(Socket socket) throws IOException {
        this.socket = socket;

//        继续不处理，往上一级抛，因为解析一旦失败就不再需要处理请求和响应了
//        三步走（已整合成方法）
        parseRequestLine();
        parseHeaders();
        parseContent();

        System.out.println("method:"+method);
        System.out.println("uri:"+uri);
        System.out.println("protocol:"+protocol);






    }

//    直接把三步定义成三个方法
    private  void  parseRequestLine() throws IOException {
        String line = readLine();
        System.out.println("请求行:"+line);
        String[]data = line.split("\\s");
//        给三个属性赋值
        method = data[0];//请求方式
        uri = data[1];//抽象路径
        protocol = data[2];//协议版本

    };
    private  void  parseHeaders() throws IOException {
//            获取的还是同一个socket的那个流，所以.read接着往后读，而不会读同一行
//            回车行被trim以后是一个空字符串
//            用来保存消息头
        while (true) {
            String line = readLine();
            if (line.isEmpty()){
                break;
            }
            System.out.println("消息头：" + line);
            String[] data = line.split(":\\s");
            headers.put(data[0].toLowerCase(),data[1]);

        }
        System.out.println("哈希表中的已经存好的键值对："+headers);
    };
    private  void  parseContent(){
            //目前还未正文

    };

//          粘贴部分

    private String readLine() throws IOException {
        InputStream in = socket.getInputStream();
        StringBuilder builder = new StringBuilder();
        char cur='a',pre='a';
        int d;
        while((d = in.read())!=-1){
            cur = (char)d;

            if(pre==13 && cur==10){
                break;
            }
            builder.append(cur);
            pre = cur;
        }
        //trim:去掉行尾的不可见的回车符
        return builder.toString().trim();
    }

//      创造Get方法，让别人能够获取这些属性，并且只需要读浏览器的请求就可以了
//      ➡因此不需要Set方法

    public String getMethod() {
        return method;
    }

    public String getUri() {
        return uri;
    }

    public String getProtocol() {
        return protocol;
    }

    public String getHeader(String name) {
//      直接只回一个对应key的value
        name = name.toLowerCase();
        return headers.get(name);
    }
}
